package com.lanou3g.code0417.tickets;

/**
 * Created by dllo on 18/4/17.
 */
//票务中心
public class TicketOffice {
    private int tickets = 100;//有100张票
    private final Object luck= new Object();

    //返回值代表是否还有票
    public boolean sellTicket() {
        /*
        为了解决线程安全问题 java引入了同步机制: synchronized
        语法:
         synchronized(luck){
         只能一时间由一个线程访问
         }
         大括号内的代码在同一时间,只能被一个线程调用
         即使线程在大括号内停止了,其他线程也无法进入到大括号内

         小括号内  我们称之为  锁对象  ,  可以是任意的对象
         但是要注意,成为锁对象的对象,不能再改变了,
         一般的,我们都会为锁对象 加上final  防止他被改变
         */
        synchronized (luck) {


            if (tickets <= 0) {
                return false;
            }


            tickets--;
            System.out.println(Thread.currentThread().getName() + "卖出一张票,还剩:" + tickets + "张");
            return true;
        }


    }
    /*
    在方法的返回值前  可以加上 synchronized关键字
    相当于把整个方法都放到同步代码块中
    不需要写锁对象,这时  锁对象是
    类名.class(这个类的类对象JVM加在这个类时,自动创建的)
     */
    public synchronized void fun(){}
}
